#include "user.h"
#include "contact.h"
#include "msgqueue.h"
#include "sig.h"

void Reboot(PSeqListType *pUserTable, PSeqListType* pContactTable)
{
    //资源释放
    if(*pUserTable != NULL)
    {
        MyFree(pUserTable);
    }
    if(*pContactTable != NULL)
    {
        MyFree(pContactTable);
    }
    //删除消息队列
    ClearMsgQ();
}

/*
    功能：后台服务处理
*/
void Server()
{
    //从文件中载入用户信息表
    PSeqListType pUserTable = LoadUserTable();
    if(NULL == pUserTable)
    {
        return;//载入用户信息失败
    }

    //从文件中载入通讯录表
    PSeqListType pContactTable = LoadContactTable();
    if(pContactTable == NULL)
    {
        Reboot(&pUserTable, NULL);//重启
        return;//载入通讯录表失败
    }

    //捕获ctrl+c信号 退出时保存文件
    SignalExitServer(pUserTable, pContactTable);

    //捕获时钟信号 每过10s更新到文件
    SignalUpdateServer(pUserTable, pContactTable, 10);

    //创建消息队列
    int res = CreateMsgQ();
	if(res == -1)
	{
		Reboot(&pUserTable, &pContactTable);//重启
        return;//创建消息队列失败
	}


    ServerRcvMsg srm = {};//消息体
    while(1) 
    {
        //开始接收消息
        res = Recive(&srm);
        if(res == -1)
        {
            continue;
        }
        //根据用户请求操作类型进行处理
        switch (srm.handle)
        {
            //发送消息，谁做了什么操作，有没有带数据
            case GETCONTACTLIST://获取用户的联系人列表
                printf("获取用户的联系人列表\n");
                GetContactList(srm.argVal.contactInfo.userId, pContactTable);
                break;
            case ADDCONTACT:// 接收进程A添加联系人信息请求
                printf("接收进程A添加联系人信息请求\n");
                res = AddContact(srm.argVal.contactInfo.userId, pContactTable, &srm.argVal.contactInfo);
                break;
            case LOGIN://接收进程A的登录请求
                printf("接收进程A的登录请求\n");
                Login(srm.argVal.userInfo.userId, srm.argVal.userInfo.password, pUserTable);
                break;
            case REGISTER://接收进程A的注册请求
                printf("接收进程A的注册请求\n");
                res = Register(&srm.argVal, pUserTable);
                break;
            case LOGOUT://接收进程A的登出请求
                printf("接收进程A的登出请求\n");
                Logout(srm.argVal.userInfo.userId, pUserTable);
                break;
            case DESTROY://接收进程A的注销请求
                printf("接收进程A的注销请求\n");
                res = Destroy(srm.argVal.userInfo.userId, pUserTable);
                break;
            case DELETECONTACT://接收进程A删除联系人信息请求
                printf("接收进程A删除联系人信息请求\n");
                res = DeleteContact(pContactTable ,&srm.argVal.contactInfo);
                break;
            case CHANGECONTACT://接收进程A修改联系人信息请求
                printf("接收进程A修改联系人信息请求\n");
                res = ChangeContact(pContactTable ,&srm.argVal.contactInfo);
                break;
            case CLEARCONTACT://接收进程A清空联系人信息请求
                printf("接收进程A清空联系人信息请求\n");
                res = CleanContact(pContactTable ,&srm.argVal.userInfo);
                break;
            default:
                break;
        }
        ShowSeqlist(pUserTable, 0);
        //ShowSeqlist(pContactTable, 1);
        if(res == -1)
        {
            return;
        }
    }
}

int main(int argc, char const *argv[])
{
    while(1)
    {
        Server();
    }
    return 0;
}
